The sharing of resources has become commonplace in software development. Shared resources such as software libraries quicken the pace of development. But shared resources can also create a number of problems for development environments where more than one process can simultaneously access and modify a shared resource. For example, one software developer can modify a shared library using an Interactive Development Environment (IDE) while another developer simultaneously uses a debugger to step through the shared library's code. Any changes one developer makes to the shared resource have the potential of interfering with the development of the other.
IDEs, editors, compilers, analyzers, debuggers, and the like, also frequently gain possession of shared resources to the exclusion of other processes for the duration of certain operations (e.g., updating the resource). This can prevent other processes from modifying the resource. While this problem can be solved by terminating all processes attached to the resource, this proves impractical for two reasons. First, as the number of shared resources grows, the number of processes which need to be stopped and started becomes unmanageable. Second, this turns out to be an inconvenient solution for the developer and wastes valuable development time.
Furthermore, given that one shared resource may depend on one or more other shared resources, there can be a complex set of dependencies between the resources. Modifications to a resource may result in changes (e.g. recompilation) to its dependants. Changes to those dependants may result in changes to their dependants, and so on. A developer is faced with manually managing this complex set of dependencies and computing how changes to one resource affect other dependent resources. As the number of resources and dependencies increases, these tasks become unmanageable. The developer may be forced into a trial and error process of testing each resource to ensure it has the correct versions of dependent resources. Or, the developer may resort to a monolithic build process for all resources under development to ensure that the current versions of all resources are being used. What is needed is better way for different processes to freely access and/or modify shared resources without conflicting with each other.